//@Author: Wijnen David [c1026300] 2013-12-09 
//-------------------------------------------
//@Description: View voor personeel te updaten
package views;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

import controllers.updateControllers.UpdatePersoneelController;
import views.parts.MyTextField;
import net.sourceforge.jdatepicker.impl.JDatePanelImpl;
import net.sourceforge.jdatepicker.impl.JDatePickerImpl;
import net.sourceforge.jdatepicker.impl.UtilDateModel;
import core.logic.services.utilServices.ValidatieService;
import core.models.dataModels.UpdatePersoneelModel;
import core.models.domainModel.Adres;
import core.models.domainModel.Eigenaar;
import core.models.domainModel.Personeel;
import core.models.domainModel.PersoneelsType;
import core.models.domainModel.Persoon;
import core.models.domainModel.PersoonNationaliteiten;
import net.miginfocom.swing.MigLayout;

import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.border.LineBorder;

import java.awt.Color;
import java.util.ArrayList;

public class UpdatePersoneelView extends JFrame
{
	//standaard serienummer
	private static final long serialVersionUID = 1L;
	
	//properties
	private UpdatePersoneelModel _model;
	private Personeel personeel;
	private Persoon persoon;
	private Adres adres;
	private MyTextField txtNaam;		
	private MyTextField txtVoornaam;
	private MyTextField txtPersoneelsNummer;
	private MyTextField txtPersoneelType;
	private MyTextField txtStraat;
	private JTextField txtHuisnummer;
	private MyTextField txtBus;
	private MyTextField txtGemeente;
	private MyTextField txtPostcode;
	private MyTextField txtStaatProvincie;
	private MyTextField txtLand;
		
	public UpdatePersoneelView(UpdatePersoneelModel model) 
	{
		_model = model;
		personeel = model.getPersoneel();
		persoon = personeel.getPersoon();
		adres = persoon.getAdres();
		
		//Opmaken labels
		JLabel lblNaam = new JLabel("Naam : ");		
		JLabel lblVoornaam = new JLabel("Voornaam : ");
		JLabel lblGeboorteDatum = new JLabel("Geboorte datum : ");
		JLabel lblPersoneelsNummer = new JLabel("Personeels nummer : ");
		JLabel lblPersoneelType = new JLabel("Personeel type : ");
		JLabel lblStraat = new JLabel("Straat : ");
		JLabel lblHuisnummer = new JLabel("Huisnummer : ");
		JLabel lblBus = new JLabel("Bus : ");
		JLabel lblGemeente = new JLabel("Gemeente : ");
		JLabel lblPostcode = new JLabel("Postcode : ");
		JLabel lblStaatprovincie = new JLabel("Staat/Provincie : ");
		JLabel lblLand = new JLabel("Land : ");
		JLabel lblEigenaar = new JLabel("Eigenaar : ");
		JLabel lblNationaliteiten = new JLabel("Nationaliteit(en):");
		
		//Opmaken textvelden
		txtNaam = new MyTextField();
		txtNaam.setColumns(10);
		
		txtVoornaam = new MyTextField();
		txtVoornaam.setColumns(10);
							
		txtPersoneelsNummer = new MyTextField();
		txtPersoneelsNummer.setColumns(10);
				
		txtPersoneelType = new MyTextField();
		txtPersoneelType.setColumns(10);
		
		txtStraat = new MyTextField();
		txtStraat.setColumns(10);
		
		txtHuisnummer = new JTextField();
		txtHuisnummer.setColumns(10);
		
		txtBus = new MyTextField();
		txtBus.setColumns(10);
		
		txtGemeente = new MyTextField();
		txtGemeente.setColumns(10);
		
		txtPostcode = new MyTextField();
		txtPostcode.setColumns(10);
		
		txtStaatProvincie = new MyTextField();
		txtStaatProvincie.setColumns(10);
		
		txtLand = new MyTextField();
		txtLand.setColumns(10);		
		
		//Date Time Picker
		JDatePanelImpl datePanel = new JDatePanelImpl(new UtilDateModel(null));
		final JDatePickerImpl picker = new JDatePickerImpl(datePanel);
		
		//LISTBOX
		//-------
		//List voor de nationaliteiten aanmaken
		final JList<PersoonNationaliteiten> lstNationaliteiten = new JList<PersoonNationaliteiten>();
		lstNationaliteiten.setBorder(new LineBorder(new Color(0, 0, 0)));
		lstNationaliteiten.setLayoutOrientation(JList.VERTICAL);
		
		//nationaliteitenlijst opvullen
		DefaultListModel<PersoonNationaliteiten> listModel = new DefaultListModel<PersoonNationaliteiten>();		
		for(PersoonNationaliteiten s: model.getAlleNationaliteiten())
		{
			listModel.addElement(s);
		}
		lstNationaliteiten.setModel(listModel);
		
		JScrollPane scrollPane = new JScrollPane(lstNationaliteiten);

		int geselecteerdItem = 0;
		for(PersoonNationaliteiten pn : persoon.getPersoonNationaliteiten())
		{
			geselecteerdItem = 0;
			for (PersoonNationaliteiten pn2: model.getAlleNationaliteiten()) {
				if (pn.equals(pn2)) {
					lstNationaliteiten.addSelectionInterval(geselecteerdItem, geselecteerdItem);
				}
				geselecteerdItem ++;
			}
		}
		
		//COMBOBOX
		//--------
		//Combobox eigenaars aanmaken en opvullen
		final JComboBox<Eigenaar> cmbEigenaar = new JComboBox<Eigenaar>();
		for(Eigenaar dezeEigenaar: model.getAlleEigenaars())
		{
			cmbEigenaar.addItem(dezeEigenaar);
		}
		
		//juiste eigenaar in de lijst selecteren
		Eigenaar eigenaar = model.getPersoneel().get_eigenaarId();
		for(int i = 0; i < cmbEigenaar.getItemCount(); i++ )
		{
			if(eigenaar.getEigenaarID() == cmbEigenaar.getItemAt(i).getEigenaarID())
			{
				cmbEigenaar.setSelectedIndex(i);
			}
		}
		
		//Gegevens opvullen
		txtNaam.setText(persoon.getNaam());
		txtVoornaam.setText(persoon.getVoornaam());
		
		String datum = _model.getPersoneel().getPersoon().getGeboortedatum();
		String[] temp = datum.split("\\/");
		
		int dag = Integer.parseInt(temp[0]);
		int maand = Integer.parseInt(temp[1]) - 1;
		int jaar = Integer.parseInt(temp[2]);
		
		picker.getModel().setDate(jaar, maand, dag);
		picker.getModel().setSelected(true);
		
		txtPersoneelsNummer.setText(model.getPersoneel().get_personeelsNummer());
		txtPersoneelType.setText(model.getPersoneel().get_personeelType().getCode().toString());
		
		//adresgegevens opvullen
		txtStraat.setText(adres.getStraat());
		txtHuisnummer.setText(adres.getHuisnummer().toString());
		txtBus.setText(adres.getBus());
		txtGemeente.setText(adres.getGemeente());
		txtPostcode.setText(adres.getPostcode());
		txtStaatProvincie.setText(adres.getStaatProvincie());
		txtLand.setText(adres.getLand());
		
		//Knop Update
		final JButton btnUpdate = new JButton("Opslaan");
		btnUpdate.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) 
			{
				//controleren of de gegevens ok zijn
				if(validateView(UpdatePersoneelView.this) == true)
				{
					String geboorteDatum = picker.getModel().getDay() + "/" + (picker.getModel().getMonth() + 1) + "/" + picker.getModel().getYear();
					
					//adresgegevens invullen (id is reeds ingevuld in het model)
					adres.setStraat(txtStraat.getText());
					adres.setHuisnummer(Integer.parseInt(txtHuisnummer.getText()));
					adres.setBus(txtBus.getText());
					adres.setGemeente(txtGemeente.getText());
					adres.setPostcode(txtPostcode.getText());
					adres.setStaatProvincie(txtStaatProvincie.getText());
					adres.setLand(txtLand.getText());
					
					//persoongegevens invullen
					persoon.setNaam(txtNaam.getText());
					persoon.setVoornaam(txtVoornaam.getText());
					persoon.setAdres(adres);
					persoon.setGeboortedatum(geboorteDatum);
					
					//personeelgegevens invulen
					personeel.set_persoonId(persoon);
					personeel.set_personeelsNummer(txtPersoneelsNummer.getText());
					personeel.set_personeelType(new PersoneelsType(txtPersoneelType.getText(), null));
					personeel.set_eigenaarId((Eigenaar)cmbEigenaar.getSelectedItem());
					
					//controlen welke nationaliteiten er geselecteerd zijn in de lijst
					ArrayList<PersoonNationaliteiten> pnLijst = new ArrayList<PersoonNationaliteiten>();
					for(PersoonNationaliteiten pn: lstNationaliteiten.getSelectedValuesList())
					{
						pnLijst.add(pn);
					}
					
					//gegevens opvullen
					_model.setNationaliteitenPersoneel(pnLijst);
					_model.setPersoneel(personeel);
					
					UpdatePersoneelController.handleView(_model);
				}
			}
		});
		
		final JButton btnAnnuleren = new JButton("Annuleren");
		btnAnnuleren.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				//terug naar het overzichtscherm
				UpdatePersoneelController.returnToPersoneelView();
			}
		});
		
		//instellingen contentPane
		getContentPane().setLayout(new MigLayout("", "[120px][120px][120px][120px]", "[20px][20px][23px][20px][23px][23px][20px][100,grow][23px]"));
		getContentPane().add(lblVoornaam, "cell 0 1,alignx left,aligny center");
		getContentPane().add(lblNaam, "cell 0 0,alignx left,aligny center");
		getContentPane().add(lblGeboorteDatum, "cell 0 2,alignx left,aligny top");
		getContentPane().add(lblPersoneelsNummer, "cell 0 3,alignx left,aligny center");
		getContentPane().add(lblPersoneelType, "cell 0 4,alignx left,aligny center");
		getContentPane().add(lblEigenaar, "cell 0 5,alignx left,aligny center");
		getContentPane().add(cmbEigenaar, "cell 1 5,growx,aligny top");
		getContentPane().add(txtPersoneelType, "cell 1 4,growx,aligny top");
		getContentPane().add(txtPersoneelsNummer, "cell 1 3,growx,aligny top");
		getContentPane().add(picker, "cell 1 2,growx,aligny top");
		getContentPane().add(txtVoornaam, "cell 1 1,growx,aligny top");
		getContentPane().add(txtNaam, "cell 1 0,growx,aligny top");
		getContentPane().add(lblHuisnummer, "cell 2 1,alignx left,aligny center");
		getContentPane().add(lblStraat, "cell 2 0,alignx left,aligny center");
		getContentPane().add(lblBus, "cell 2 2,alignx left,aligny center");
		getContentPane().add(lblGemeente, "cell 2 3,alignx left,aligny center");
		getContentPane().add(lblPostcode, "cell 2 4,alignx left,aligny center");
		getContentPane().add(lblStaatprovincie, "cell 2 5,alignx left,aligny center");
		getContentPane().add(lblLand, "cell 2 6,alignx left,aligny center");
		getContentPane().add(lblNationaliteiten, "cell 2 7,alignx left,aligny center");
		getContentPane().add(txtStaatProvincie, "cell 3 5,growx,aligny top");
		getContentPane().add(txtPostcode, "cell 3 4,growx,aligny top");
		getContentPane().add(txtGemeente, "cell 3 3,growx,aligny top");
		getContentPane().add(txtStraat, "cell 3 0,growx,aligny top");
		getContentPane().add(txtBus, "cell 3 2,growx,aligny top");
		getContentPane().add(txtHuisnummer, "cell 3 1,growx,aligny top");
		getContentPane().add(txtLand, "cell 3 6,growx,aligny top");	
		getContentPane().add(scrollPane, "flowx,cell 3 7,growx");
		getContentPane().add(btnUpdate, "cell 0 8,growx,aligny top");
		getContentPane().add(btnAnnuleren, "cell 1 8,growx");
	}
	
	private static Boolean validateView(UpdatePersoneelView scherm)
	{
		if(!ValidatieService.isPresentAndLength(scherm.txtNaam, 150, "Naam"))
			return false;
		
		if(!ValidatieService.isPresentAndLength(scherm.txtVoornaam, 150, "Voornaam"))
			return false;
		
		//geboortedatum = picker.getModel().getDay() + "/" + (picker.getModel().getMonth() + 1) + "/" + picker.getModel().getYear();
		
		//if(!ValidatieService.isPresentAndLength(scherm.txtGeboorteDatum, 45, "Geboortedatum"))
			//return false;
		
		if(!ValidatieService.isPresentAndLength(scherm.txtPersoneelsNummer, 45, "Personeelsnummer"))
			return false;
		
		if(!ValidatieService.isPresentAndLength(scherm.txtPersoneelType, 1, "Personeelstype"))
			return false;		
		
		// eigenaar???
		
		if(!ValidatieService.isPresentAndLength(scherm.txtStraat, 150, "Straat"))
			return false;
		
		if(!ValidatieService.isPresentAndLength(scherm.txtHuisnummer, 20, "Huisnummer"))
			return false;
		
		if(!ValidatieService.isLength(scherm.txtBus, 10, "Bus"))
			return false;
		
		if(!ValidatieService.isPresentAndLength(scherm.txtGemeente, 150, "Gemeente"))
			return false;
		
		if(!ValidatieService.isPresentAndLength(scherm.txtPostcode, 20, "Postcode"))
			return false;
		
		if(!ValidatieService.isPresentAndLength(scherm.txtStaatProvincie, 150, "Staat/Provincie"))
			return false;
		
		if(!ValidatieService.isPresentAndLength(scherm.txtLand, 150, "Land"))
			return false;
		
		return true;
	}
}
	
	
	
	